home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / ddragon.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  4KB  |  194 lines

  1. /***************************************************************************
  2.  
  3.   Video Hardware for Double Dragon (bootleg) & Double Dragon II
  4.  
  5. ***************************************************************************/
  6.  
  7. #include "driver.h"
  8. #include "vidhrdw/generic.h"
  9. #include <stdio.h>
  10.  
  11. unsigned char *dd_videoram;
  12. int dd_scrollx_hi, dd_scrolly_hi;
  13. unsigned char *dd_scrollx_lo;
  14. unsigned char *dd_scrolly_lo;
  15. unsigned char *dd_spriteram;
  16. int dd2_video;
  17.  
  18.  
  19.  
  20. int dd_vh_start( void )
  21. {
  22.     dirtybuffer = malloc( 0x400 );
  23.     if( dirtybuffer )
  24.     {
  25.         memset(dirtybuffer,1, 0x400);
  26.  
  27.         tmpbitmap = osd_new_bitmap(
  28.                 Machine->drv->screen_width*2,
  29.                 Machine->drv->screen_height*2,
  30.                 Machine->scrbitmap->depth );
  31.  
  32.         if( tmpbitmap ) return 0;
  33.  
  34.         free( dirtybuffer );
  35.     }
  36.  
  37.     return 1;
  38. }
  39.  
  40.  
  41.  
  42. void dd_vh_stop( void )
  43. {
  44.     osd_free_bitmap( tmpbitmap );
  45.     free( dirtybuffer );
  46. }
  47.  
  48.  
  49. WRITE_HANDLER( dd_background_w )
  50. {
  51.     if( dd_videoram[offset] != data ){
  52.         dd_videoram[offset] = data;
  53.         dirtybuffer[offset/2] = 1;
  54.     }
  55. }
  56.  
  57.  
  58. static void dd_draw_background( struct osd_bitmap *bitmap )
  59. {
  60.     const struct GfxElement *gfx = Machine->gfx[2];
  61.  
  62.     int scrollx = -dd_scrollx_hi - ( dd_scrollx_lo[0] );
  63.     int scrolly = -dd_scrolly_hi - ( dd_scrolly_lo[0] );
  64.  
  65.     int offset;
  66.  
  67.     for( offset = 0; offset<0x400; offset++ ){
  68.         int attributes = dd_videoram[offset*2];
  69.         int color = ( attributes >> 3 ) & 0x7;
  70.         if( dirtybuffer[offset] ){
  71.             int tile_number = dd_videoram[offset*2+1] + ((attributes&7)<<8);
  72.             int xflip = attributes & 0x40;
  73.             int yflip = attributes & 0x80;
  74.             int sx = 16*(((offset>>8)&1)*16 + (offset&0xff)%16);
  75.             int sy = 16*(((offset>>9)&1)*16 + (offset&0xff)/16);
  76.  
  77.             /* CALB ????
  78.                           if( sx<0 || sx>=512 || sy<0 || sy>=512 ) ExitToShell();*/
  79.  
  80.             drawgfx(tmpbitmap,gfx,
  81.                 tile_number,
  82.                 color,
  83.                 xflip,yflip,
  84.                 sx,sy,
  85.                 0,TRANSPARENCY_NONE,0);
  86.  
  87.             dirtybuffer[offset] = 0;
  88.         }
  89.     }
  90.  
  91.     copyscrollbitmap(bitmap,tmpbitmap,
  92.             1,&scrollx,1,&scrolly,
  93.             &Machine->drv->visible_area,
  94.             TRANSPARENCY_NONE,0);
  95. }
  96.  
  97. #define DRAW_SPRITE( order, sx, sy ) drawgfx( bitmap, gfx, \
  98.                     (which+order),color,flipx,flipy,sx,sy, \
  99.                     clip,TRANSPARENCY_PEN,0);
  100.  
  101. static void dd_draw_sprites( struct osd_bitmap *bitmap )
  102. {
  103.     const struct rectangle *clip = &Machine->drv->visible_area;
  104.     const struct GfxElement *gfx = Machine->gfx[1];
  105.  
  106.     unsigned char *src = &( dd_spriteram[0x800] );
  107.     int i;
  108.  
  109.     for( i = 0; i < ( 64 * 5 ); i += 5 ) {
  110.         int attr = src[i+1];
  111.         if ( attr & 0x80 ) { /* visible */
  112.             int sx = 240 - src[i+4] + ( ( attr & 2 ) << 7 );
  113.             int sy = 240 - src[i+0] + ( ( attr & 1 ) << 8 );
  114.             int size = ( attr & 0x30 ) >> 4;
  115.             int flipx = ( attr & 8 );
  116.             int flipy = ( attr & 4 );
  117.  
  118.             int which;
  119.             int color;
  120.  
  121.             if ( dd2_video ) {
  122.                 color = ( src[i+2] >> 5 );
  123.                 which = src[i+3] + ( ( src[i+2] & 0x1f ) << 8 );
  124.             } else {
  125.                 color = ( src[i+2] >> 4 ) & 0x07;
  126.                 which = src[i+3] + ( ( src[i+2] & 0x0f ) << 8 );
  127.             }
  128.  
  129.             switch ( size ) {
  130.                 case 0: /* normal */
  131.                 DRAW_SPRITE( 0, sx, sy );
  132.                 break;
  133.  
  134.                 case 1: /* double y */
  135.                 DRAW_SPRITE( 0, sx, sy - 16 );
  136.                 DRAW_SPRITE( 1, sx, sy );
  137.                 break;
  138.  
  139.                 case 2: /* double x */
  140.                 DRAW_SPRITE( 0, sx - 16, sy );
  141.                 DRAW_SPRITE( 2, sx, sy );
  142.                 break;
  143.  
  144.                 case 3:
  145.                 DRAW_SPRITE( 0, sx - 16, sy - 16 );
  146.                 DRAW_SPRITE( 1, sx - 16, sy );
  147.                 DRAW_SPRITE( 2, sx, sy - 16 );
  148.                 DRAW_SPRITE( 3, sx, sy );
  149.                 break;
  150.             }
  151.         }
  152.     }
  153. }
  154.  
  155. #undef DRAW_SPRITE
  156.  
  157. static void dd_draw_foreground( struct osd_bitmap *bitmap )
  158. {
  159.     const struct GfxElement *gfx = Machine->gfx[0];
  160.     unsigned char *source = videoram;
  161.  
  162.     int sx,sy;
  163.  
  164.     for( sy=0; sy<256; sy+=8 ){
  165.         for( sx=0; sx<256; sx+=8 ){
  166.             int attributes = source[0];
  167.             int tile_number = source[1] + 256*( attributes & 7 );
  168.             int color = ( attributes >> 5 ) & 0x7;
  169.  
  170.             if ( tile_number ) {
  171.                 drawgfx( bitmap,gfx, tile_number,
  172.                 color,
  173.                 0,0, /* no flip */
  174.                 sx,sy,
  175.                 0, /* no need to clip */
  176.                 TRANSPARENCY_PEN,0);
  177.             }
  178.             source += 2;
  179.         }
  180.     }
  181. }
  182.  
  183.  
  184.  
  185. void dd_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  186. {
  187.     if (palette_recalc())
  188.          memset(dirtybuffer,1, 0x400);
  189.  
  190.     dd_draw_background( bitmap );
  191.     dd_draw_sprites( bitmap );
  192.     dd_draw_foreground( bitmap );
  193. }
  194.